import antfu from '@antfu/eslint-config';

import { FlatCompat } from '@eslint/eslintrc';

const compat = new FlatCompat();
// 创建配置
export default antfu({
  // 忽略的文件和目录
  ignores: [
    '*.sh',
    '**/*.sh/**',
    'node_modules',
    '**/node_modules/**',
    '**/packages/**',
    '*.md',
    '**/*.md/**',
    '*.woff',
    '**/*.woff/**',
    '*.ttf',
    '**/*.ttf/**',
    '.vscode',
    '**/.vscode/**',
    '.idea',
    '**/.idea/**',
    'dist',
    '**/dist/**',
    'public',
    'public/**',
    'docs',
    'docs/**',
    '.husky',
    '**/.husky/**',
    '.local',
    '**/.local/**',
    'bin',
    'bin/**',
    'Dockerfile',
    '**/Dockerfile/**',
    'uno.config.ts',
    '**/uno.config.ts/**',
    'mock/**/*',
  ],

  // Vue 配置
  vue: {
    vueVersion: 3,
  },

  // TypeScript 配置
  typescript: {
    tsconfigPath: 'tsconfig.json',
  },

  // 代码风格配置
  stylistic: {
    indent: 2,
    quotes: 'single',
    semi: true,
  },

  // 格式化器配置
  formatters: {
    css: true,
    html: true,
    markdown: 'prettier',
  },

  jsonc: true,
  yaml: true,

  // 使用较少的严格规则
  lessOpinionated: true,

  // 禁用 pnpm 相关规则
  pnpm: false,

  // 自定义规则配置
  rules: {
    // 允许使用 console
    'no-console': 'off',

    'vue/no-unused-refs': 'off',
    // Vue: Property proxy does not exist on type ComponentInternalInstance | null
    'vue/no-undef-properties': 'off',
    // 完全关闭未使用变量的规则
    'unused-imports/no-unused-vars': 'off',
    'no-unused-vars': 'off',

    // 允许 any 类型
    'ts/no-explicit-any': 'off',
    'ts/no-unsafe-return': 'off',
    'ts/no-unsafe-member-access': 'off',
    'ts/no-unsafe-assignment': 'off',
    'ts/no-unsafe-call': 'off',
    'ts/no-unsafe-argument': 'off',
    'ts/no-unsafe-new': 'off',
    'ts/no-unsafe-enum-comparison': 'off',
    // Vue 相关规则
    'vue/multi-word-component-names': 'off', // 允许单词组件名

    /**
     * @description 允许在case子句中声明变量
     */
    'no-case-declarations': 'off',
    /**
     * @description 允许在定义变量之前使用变量
     */
    'no-use-before-define': 'off',
    /**
     * @description 关闭函数括号前空格检查
     */
    'space-before-function-paren': 'off',

    // /**
    //  * @description import语句必须放在文件顶部
    //  */
    // 'import/first': 'error',
    // /**
    //  * @description import语句后必须有一个空行
    //  */
    // 'import/newline-after-import': 'error',
    // /**
    //  * @description 禁止重复导入
    //  */
    // 'import/no-duplicates': 'error',

    /**
     * @description 完全关闭TypeScript未使用变量检查
     */
    '@typescript-eslint/no-unused-vars': 'off',

    /**
     * @description 允许使用@ts-ignore注释
     */
    '@typescript-eslint/ban-ts-ignore': 'off',
    /**
     * @description 允许使用@ts-comment注释
     */
    '@typescript-eslint/ban-ts-comment': 'off',
    /**
     * @description 允许使用特定类型（如{}）
     */
    '@typescript-eslint/ban-types': 'off',
    /**
     * @description 不要求函数必须有明确的返回类型
     */
    '@typescript-eslint/explicit-function-return-type': 'off',
    /**
     * @description 允许使用any类型
     */
    '@typescript-eslint/no-explicit-any': 'off',
    /**
     * @description 允许使用require语句
     */
    '@typescript-eslint/no-var-requires': 'off',
    /**
     * @description 允许空函数
     */
    '@typescript-eslint/no-empty-function': 'off',
    /**
     * @description 允许在定义变量之前使用变量
     */
    '@typescript-eslint/no-use-before-define': 'off',
    /**
     * @description 允许使用非空断言操作符!
     */
    '@typescript-eslint/no-non-null-assertion': 'off',
    /**
     * @description Is不要求导出函数和类必须有明确的返回类型和参数类型
     */
    '@typescript-eslint/explicit-module-boundary-types': 'off',

    // /**
    //  * @description 确保在setup中声明的变量能在模板中使用
    //  */
    // 'vue/script-setup-uses-vars': 'error',
    /**
     * @description 允许使用Vue保留的组件名
     */
    'vue/no-reserved-component-names': 'off',
    /**
     * @description 不强制自定义事件名称的大小写风格
     */
    'vue/custom-event-name-casing': 'off',
    'vue/no-unused-vars': 'off',
    /**
     * @description 不强制组件属性排序
     */
    'vue/attributes-order': 'off',
    /**
     * @description 允许一个文件中有多个组件
     */
    'vue/one-component-per-file': 'off',
    /**
     * @description 不要求HTML结束标签的括号必须换行
     */
    'vue/html-closing-bracket-newline': 'off',
    /**
     * @description 不限制每行最大属性数量
     */
    'vue/max-attributes-per-line': 'off',
    /**
     * @description 不要求多行HTML元素的内容必须换行
     */
    'vue/multiline-html-element-content-newline': 'off',
    /**
     * @description 不要求单行HTML元素的内容必须换行
     */
    'vue/singleline-html-element-content-newline': 'off',
    /**
     * @description 不要求属性名使用连字符形式
     */
    'vue/attribute-hyphenation': 'off',
    /**
     * @description 不要求props必须有默认值
     */
    'vue/require-default-prop': 'off',
    /**
     * @description 不要求emits必须显式声明
     */
    'vue/require-explicit-emits': 'off',

    /**
     * @description HTML元素自闭合标签规则
     */
    'vue/html-self-closing': [
      'error',
      {
        /**
         * @description HTML标签规则
         */
        html: {
          /**
           * @description 空元素（如input）总是自闭合
           */
          void: 'always',
          /**
           * @description 普通元素不自闭合
           */
          normal: 'never',
          /**
           * @description 组件总是自闭合
           */
          component: 'always',
        },
        /**
         * @description SVG元素总是自闭合
         */
        svg: 'always',
        /**
         * @description MathML元素总是自闭合
         */
        math: 'always',
      },
    ],    // 导入排序规则（已注释掉）
    // 'sort-imports': [
    //   'error',
    //   {
    //     ignoreCase: true,
    //     ignoreDeclarationSort: false,
    //     ignoreMemberSort: false,
    //     memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'],
    //     allowSeparatedGroups: false,
    //   },
    // ],

    /**
     * @description 关闭未定义变量检查
     */
    'no-undef': 'off',
    /**
     * @description 关闭prop验证检查
     */
    'vue/require-valid-default-prop': 'off',
    /**
     * @description 计算属性不应有副作用，降级为警告
     */
    'vue/no-side-effects-in-computed-properties': 'off',
    /**
     * @description 不使用弃用的过滤器语法，降级为警告
     */
    'vue/no-deprecated-filter': 'off',
    /**
     * @description emits定义必须有效，降级为警告
     */
    'vue/valid-define-emits': 'off',
    /**
     * @description 不应修改props，降级为警告
     */
    'vue/no-mutating-props': 'off',
    /**
     * @description this的别名使用限制，降级为警告
     */
    '@typescript-eslint/no-this-alias': 'off',
    /**
     * @description 不允许空代码块，降级为警告
     */
    'no-empty': 'warn',
    /**
     * @description 模板中变量不应重名，降级为警告
     */
    'vue/no-template-shadow': 'off',
    /**
     * @description v-for指令必须有效，降级为警告
     */
    'vue/valid-v-for': 'warn',
    /**
     * @description model
     */
    'vue/require-prop-types': 'off',
    /**
     * @description 推荐从vue包中导入API，降级为警告
     */
    'vue/prefer-import-from-vue': 'warn',
    /**
     * @description 优先使用const声明变量，降级为警告
     */
    'prefer-const': 'off',
    /**
     * @description 推荐使用剩余参数而非arguments，降级为警告
     */
    'prefer-rest-params': 'off',
    /**
     * @description 不必要的转义字符，降级为警告
     */
    'no-useless-escape': 'off',
  },

},
// 语言选项，包括全局变量
...compat.config(
  {
    extends: [
      './packages/eslint-config/.eslintrc-auto-import.json',
    ],
  },
));
